10.5 実行制御 [大部分 6.0]
-
[5.3]
BLOCK構文 [5.3]は実行コード部分での宣言を利用可能とします。 例を以下に示します。Do i=1,n Block Real tmp tmp = a(i)**3 If (tmp>b(i)) b(i) = tmp End Block End Doここで変数tmpの有効範囲はBLOCK構文内に限られ、その外側に影響を及ぼしません。 この機能はINCLUDEを利用する場合やマクロ処理で特に有用です。BLOCK内ではCOMMON,EQUIVALENCE,IMPLICIT,INTENT,NAMELIST,OPTIONAL,VALUE, および文関数以外の全ての宣言が許されています。BLOCK構文はネストすることが可能です。 他の構文と同様にBLOCK構文外部から内部への分岐は許されていません。BLOCK構文内から外部への分岐は、同構文の実行を完了させます。BLOCK構文内の言語要素でSAVE属性を持たないものは、同構文が完了した時点で消滅します。 例えば、割付けされたALLOCATABLE変数は自動的に開放され、FINAL手続を持つ変数は最終化されます。 -
EXIT文はDO構文だけではなくASSOCIATE、BLOCK、IF、SELECT CASE、SELECT TYPEの各名前付き構文でも利用可能です。(FORALLとWHERE以外の名前付き構文) 構文名を持たないEXIT文は名前付き構文の有るなしに係らず従来通り最も内側のDO構文より脱出します。 -
STOP文で、stop-codeが整数型もしくは基本文字型のどのようなスカラ定数式も指定できるようになりました。 (この変更はPAUSE文にも適用されていますが、現在ではPAUSE文はFortran標準ではなくなっています) 更に整数を指定したSTOP文はプロセスの返却コードとしてその値を返します。 (多くのオペレーティングシステムでは返却コードの制限があるため、nAG Fortranコンパイラでは最下位8ビットの値を返します。) -
ERROR STOP文が追加されました。 この文はSTOPと似ていますが、プログラムを(正常終了ではなく)異常終了させます。 書式は最初に記述する‘ERROR’部分を除きSTOP文と同等です。 正常終了時のデフォルトのプロセス終了ステータスはゼロですが異常終了の場合は非ゼロとなります。例)
IF (x<=0) ERROR STOP 'x must be positive'
-
[6.1]
FORALL構文は最初の文で省略可能な型指定子が指定可能です。これにより指標変数の型(INTEGERでなければならない)と種別が指定可能です。 この指定が行われた場合有効範囲外に存在する(あるいは存在しない)同じ名前を持つ要素は指標変数の影響を全く受けなくなります。 例)Complex i(100) Real x(200) ... Forall (Integer :: i=1:Size(x)) x(i) = i
FORALL構文は高いパフォーマンスが望まれる場合に推奨されません。 これはこの構文が反復空間と同じ大きさの一時的な配列に右辺評価値を格納した上で変数への代入を行うことに繋がり、 これは一般的に通常DOループよりも悪いパフォーマンスになります。 -
[6.1]
DO CONCURRENT構文は制限付きのDOループであり効率的な実行を可能とします。DO CONCURRENT構文の反復はどのような順序で実行されても良いものです。(並列に行われても良い) ループ指標変数は構文内の局所的なものです。DO CONCURRENTのヘッダ部分はFORALLと似ています。 (明示的に反復指標変数の型や種別やスカラ制御配列を指定できる点等)DO CONCURRENT構文の制限は以下のとおりです。-
構文内から構文外への分岐は許されません。
これには
RETURN文とSTOP文が含まれますがERROR STOP文は含まれません。 -
EXIT文でループを終了させる事はできません。 -
CYCLE文は外側ループを参照できません。 - ループ反復間で依存関係があってはなりません。 もしも変数への代入が反復で行われる場合、他の反復でこの変数を参照できません (他の反復でこの変数の参照前に代入を行う場合はこの限りではありません)
- 構文内で参照されるすべての手続きは純粋でなければなりません。
- ループ内に像制御文があってはなりません。
-
IEEE_GET_FLAGもしくはIEEE_SET_HALTING_MODEの参照は許されません。
例)
Integer vsub(n) ... Do Concurrent (i=1:n) ! Safe because vsub has no duplicate values. x(vsub(i)) = i End DoDO CONCURRENT文の文法は以下のとおりです。[ do-construct-name
ここでforall-headerは:]DO[ label ] [,]CONCURRENTforall-header
ここでmask-exprはスカラ論理式でtriplet-specは([ integer-type-spec::] triplet-spec [,triplet-spec ]... [,mask-expr ])name = expr : expr [ : expr ]
-
構文内から構文外への分岐は許されません。
これには
